package com.atzzgc.http;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

/**
 * Http请求工具类。
 * <p>
 * 
 * 依赖：commons-io:commons-io:1.4
 * @since 0.1
 */
public class HttpUtil {

	private static Logger log = Logger.getLogger(HttpUtil.class);

	/**
	 * 默认编码
	 */
	public static final Charset DEFAULT_ENCODING = Consts.UTF_8;

	/**
	 * 以GET方式发送一个HTTP请求，当响应状态码为200时将响应内容以字符串返回。
	 * <p>
	 * 此方法采用默认编码{@link #DEFAULT_ENCODING}。
	 * 
	 * @param url
	 *            请求地址。
	 */
	public static String get(String url) {
		return get(url, DEFAULT_ENCODING);
	}

	/**
	 * 以GET方式发送一个HTTP请求，当响应状态码为200时将响应内容以字符串返回。
	 * <p>
	 * 此方法采用指定编码。
	 * 
	 * @param url
	 *            请求地址。
	 * @param encoding
	 *            指定编码。
	 * 
	 * @return http响应内容。<br/>
	 *         当请求失败或url有问题时返回null。
	 */
	public static String get(String url, Charset g) {

		CloseableHttpClient httpclient = HttpClients.createDefault();
		HttpGet httpget = new HttpGet(url);  
		ResponseHandler<String> rh = new ResponseHandler<String>() {  
		  
		    @Override  
		    public String handleResponse(  
		            final HttpResponse response) throws IOException {  
		    	
		    	String result = null;
		        StatusLine statusLine = response.getStatusLine();  
		        HttpEntity entity = response.getEntity();  
		        if (statusLine.getStatusCode() == 200) {
					// 返回响应内容
					result = EntityUtils.toString(entity);
				}
		        return result;
		    }  
		};  
		String result = null;
		try {
			result = httpclient.execute(httpget, rh);
			httpclient.close();
		} catch (Exception e) {
			e.printStackTrace();
			log.info(e.getMessage());
		} 
		return result;
	}

	/**
	 * 以POST方式发送一个HTTP请求，当响应状态码为200时将响应内容以字符串返回。
	 * <p>
	 * 此方法采用默认编码{@link #DEFAULT_ENCODING}。
	 * 
	 * @param url
	 *            请求地址。
	 * @param data
	 *            请求数据。
	 */
	public static String post(String url, Map<String, Object> data) {
		return post(url, data, DEFAULT_ENCODING);
	}

	/**
	 * 以POST方式发送一个HTTP请求，当响应状态码为200时将响应内容以字符串返回。
	 * <p>
	 * 此方法采用指定编码。目前只不支持文件传输。
	 * 
	 * @param url
	 *            请求地址。
	 * @param data
	 *            请求数据。
	 * @param encoding
	 *            指定编码。
	 * 
	 * @return http响应内容。<br/>
	 *         当请求失败或url有问题时返回null。
	 */
	public static String post(String url, Map<String, Object> data, Charset encoding) {

		CloseableHttpClient httpclient = HttpClients.createDefault();
		List<NameValuePair> formparams = new ArrayList<NameValuePair>();
		// 添加参数数据
		for (String key : data.keySet()) {
			formparams.add(new BasicNameValuePair(key, data.get(key) == null ? "" : data.get(key).toString()));
		}
		UrlEncodedFormEntity entity = null;
		if(encoding != null){
			entity = new UrlEncodedFormEntity(formparams,encoding);
		}else{
			try {
				entity = new UrlEncodedFormEntity(formparams);
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		HttpPost httppost = new HttpPost(url);
		httppost.setEntity(entity);
		ResponseHandler<String> rh = new ResponseHandler<String>() {  
		  
		    @Override  
		    public String handleResponse(  
		            final HttpResponse response) throws IOException {  
		    	
		    	String result = null;
		        StatusLine statusLine = response.getStatusLine();  
		        HttpEntity entity = response.getEntity();  
		        if (statusLine.getStatusCode() == 200) {
					// 返回响应内容
					result = EntityUtils.toString(entity);
				}
		        return result;
		    }  
		};  
		String result = null;
		try {
			result = httpclient.execute(httppost, rh);
			httpclient.close();
		} catch (Exception e) {
			e.printStackTrace();
			log.info(e.getMessage());
		} 
		return result;
	}

}
